package com.piesat.quake.business.device.bis;

import com.piesat.quake.business.device.model.config.StationData;
import com.piesat.quake.business.device.mqtt.param.ParseParam;

import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 设备交互帮助类
 *
 * @author Gersy
 * @date 2023/2/14
 * @since 1.0
 */
@Component
public class MqttHelper {
    private static final String PREFIX = "vibrate/";
    /**
     * 主题版本字典
     */
    private static final ConcurrentHashMap<String, String> TOPIC_VERSION_MAP = new ConcurrentHashMap<>();

    public static interface Inbound {
        /**
         * 注册报文
         */
        String REGISTER = "register/data";
        /**
         * 特征数据报文
         */
        String FEATURE = "feature/data";
        /**
         * 实时数据报文
         */
        String REALTIME = "ontime/data";
        /**
         * 地震事件报文
         */
        String EVENT_DATA = "event/data";

        /**
         * 获取设备配置
         */
        String CONFIG_DATA = "conf/data";
        /**
         * 获取设备状态
         */
        String DEVICE_STATUS = "conf/data";
    }

    public static interface Outbound {
        /**
         * 注册响应
         */
        String REGISTER = "/register/control/";
        /**
         * 实时状态控制报文
         */
        String REALTIME_CONTROL = "/ontime/control/";
        /**
         * 更新设备的报文
         */
        String UPDATE_DEVICE = "/update/control/";
        /**
         * 获取设备日志的报文
         */
        String LOG = "/log/control/";
        /**
         * 获取设备配置的报文
         */
        String DEVICE_CONFIG = "/conf/control/get/";
        /**
         * 更新设备配置的报文
         */
        String UPDATE_CONFIG = "/conf/control/set/";
        /**
         * 特征值请求的报文
         */
        String FEATURE_CONTROL = "/feature/control/";
    }

    public static void initVersionCache(List<StationData> list) {
        for (StationData stationData : list) {
            TOPIC_VERSION_MAP.put(stationData.getId(), stationData.getTopicVersion());
        }
    }

    public static String getTopic(String id, String topic) {
        return PREFIX + id + topic + getVersion(id);
    }

    public static void setVersion(String id, String version) {
        TOPIC_VERSION_MAP.put(id, version);
    }


    /**
     * 获取台站当前软件版本
     *
     * @param clientId 台站ID
     */
    public static String getVersion(String clientId) {
        String s = TOPIC_VERSION_MAP.get(clientId);
        return s == null ? "v2" : s;
    }

    /**
     * 通过注册报文获取报文的版本
     *
     * @param registerTopic 注册主题
     */
    public static StationData setVersion(String registerTopic) {
        String substring = registerTopic.replace(PREFIX, "");
        String clientId = substring.substring(0, substring.indexOf("/"));
        String version = substring.substring(substring.lastIndexOf("/") + 1);
        TOPIC_VERSION_MAP.put(clientId, version);
        StationData stationData = new StationData();
        stationData.setId(clientId);
        stationData.setTopicVersion(version);
        return stationData;
    }

    /**
     * 获取主题的解析参数
     *
     * @param topic 主题
     */
    public static List<? extends ParseParam> getParams(String topic) {
//        return PARSE_CONFIG.get(topic);
        return null;
    }

    /**
     * 注册响应
     *
     * @param id 台站ID
     */
    public static String getRegisterTopic(String id) {
        return PREFIX + id + "/register/control/" + getVersion(id);
    }

    /**
     * 实时状态控制报文
     *
     * @param id 台站ID
     */
    public static String getRealtimeControlTopic(String id) {
        return PREFIX + id + "/ontime/control/" + getVersion(id);
    }

    /**
     * 更新设备的报文
     *
     * @param id 台站ID
     */
    public static String getUpgradeDeviceTopic(String id) {
        return PREFIX + id + "/update/control/" + getVersion(id);
    }

    /**
     * 获取设备日志的报文
     *
     * @param id 台站ID
     */
    public static String getLogTopic(String id) {
        return PREFIX + id + "/log/control/" + getVersion(id);
    }

    /**
     * 获取设备配置的报文
     *
     * @param id 台站ID
     */
    public static String getDeviceConfigTopic(String id) {
        return PREFIX + id + "/conf/control/get/" + getVersion(id);
    }

    /**
     * 更新设备配置的报文
     *
     * @param id 台站ID
     */
    public static String getUpdateConfigTopic(String id) {
        return PREFIX + id + "/conf/control/set/" + getVersion(id);
    }
}
